package spark_Core

import org.apache.spark.{SparkConf, SparkContext}

object HelloSpark {
  def main(args: Array[String]): Unit = {

    //      spark编
    //      rdd 弹性分布式数据集 类似于array ，操作的是数据集

    /*
      环境：1）运行模式 本地模式，yarn-client，yarn-cluster，配置 本地模式，
             配置项 SparkConf
             任务 SparkConf appName
             设置 内存
           2）SparkContext SC 提交job任务 spark 客户端
           3）spark基于内存的，跑的数据如果宕机，
           4）依赖 spark core 依赖
     */

    //RDD  Resilient Distributed Dataset 弹性 分布式数据集
    // 弹性 spark 编程
    // 分布式  在集群上就近读取数据运行/计算
    // 数据集  集合


    // 所有操作的对象 都是一个集合 Array ，



    //      词频统计
    val conf = new SparkConf().setMaster("local[*]").setAppName("hello spark") //spark配置
    //    conf配置，sparkcontext sc spark 上下文/
    val sc = new SparkContext(conf)
    //    构建了数据，数组
    val arr = Array("hello world", "hello java", "hello spark")
    val arrnew = sc.parallelize(arr) //将数组转化为rdd
//data:("hello world", "hello java", "hello spark")
    val obj = arrnew.flatMap(x => x.split(" ")) // hello word hello java
    //    flatMap(x => x.split(" "))  匿名函数， 将每个元素按空格进行切分  ((hello world),(hello java),(hello spark))
    //    flatMap   切分 压平  hello,world,hello,java,hello,spark  一个一个
//    obj hello,world,hello,java,hello,spark

    /**    1 函数方法
     *    def hello(name:string,age:int) ={
     *      函数体
     *      println("111")
     *    }
     *    2 缩写简写
     *     def hello(name:string,age:int) =   println("111")
     *    3 匿名函数
     *      (name:string,age:int) =>   println("111")
     *     4
     *      (name,age) =>   println("111")
     *      5
     *      name => println(name)
     *
     *
     */
    val obj1 = obj.map(x => (x, 1)) // (hello,1) (world,1) (hello,1)
//    obj1 (key,1)
    val obj2 = obj1.reduceByKey((x, y) => x + y) //(hello,3) (world,1)
//    将相同key的value相加
    obj2.foreach(x => {
      println(x)
    })
    //foreach 循环遍历
    //    sc.stop()
    /**
     *   spark 编码 简洁，优雅
     *   中间的值 直接打印 没有结果
     *   spark 算子 （函数逻辑， sum ，count，avg）
     *   算子  transformation 转换类型的算子     flatMap
     *           转换类型的算子不执行结果，只执行计算的逻辑
     *
     *   算子  action  动作类型的算子
     *           执行计算结果
     */
    //简洁
    arrnew.flatMap(_.split(" ")).map((_,1)).reduceByKey((_+_)).foreach(println(_))
    // 下划线 表示 通配符(相当于参数值x)

  }
}
